import java.util.LinkedList;

/*
 * @lc app=leetcode.cn id=405 lang=java
 *
 * [405] 数字转换为十六进制数
 *
 * https://leetcode.cn/problems/convert-a-number-to-hexadecimal/description/
 *
 * algorithms
 * Easy (55.40%)
 * Likes:    258
 * Dislikes: 0
 * Total Accepted:    58.9K
 * Total Submissions: 106.5K
 * Testcase Example:  '26'
 *
 * 给定一个整数，编写一个算法将这个数转换为十六进制数。对于负整数，我们通常使用 补码运算 方法。
 * 
 * 注意:
 * 
 * 
 * 十六进制中所有字母(a-f)都必须是小写。
 * 
 * 十六进制字符串中不能包含多余的前导零。如果要转化的数为0，那么以单个字符'0'来表示；对于其他情况，十六进制字符串中的第一个字符将不会是0字符。 
 * 给定的数确保在32位有符号整数范围内。
 * 不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。
 * 
 * 
 * 示例 1：
 * 
 * 
 * 输入:
 * 26
 * 
 * 输出:
 * "1a"
 * 
 * 
 * 示例 2：
 * 
 * 
 * 输入:
 * -1
 * 
 * 输出:
 * "ffffffff"
 * 
 * 
 */

// @lc code=start
class Solution {
    public String toHex(int num) {
        if (num==0) {
            return "0";
        }
        LinkedList<Integer> data=new LinkedList<>();
        StringBuilder stringBuilder=new StringBuilder();
        int flag=1;
        if (num<0) {
            flag=-1;
            num=-num;
        }
        while (num>0) {
            data.addLast(num%16);
            num/=16;
        }
        if (flag==-1) {
            for (int i = 0; i < data.size(); i++) {
                data.addLast(15-data.pollFirst());
            }
            int middle=1;
            while (!data.isEmpty()) {
                int middle1=data.pollFirst()+middle;
                middle=middle1/16;
                middle1%=16;
                if (middle1<10) {
                    stringBuilder.append(String.valueOf(middle1));
                }else{
                    switch (middle1) {
                        case 10:
                            stringBuilder.append('a');
                            continue;
                        case 11:
                        stringBuilder.append('b');
                            continue;
                        case 12:
                        stringBuilder.append('c');
                            continue;
                        case 13:
                        stringBuilder.append('d');
                        
                            continue;
                        case 14:
                        stringBuilder.append('e');
                        
                            continue;
                        case 15:
                        stringBuilder.append('f');
                    }
                }
                
            }
            while (stringBuilder.length()<8) {
                stringBuilder.append('f');
            }
        }
        else{
            while (!data.isEmpty()) {
                int middle1=data.pollFirst();
                if (middle1<10) {
                    stringBuilder.append(String.valueOf(middle1));
                }else{
                    switch (middle1) {
                        case 10:
                            stringBuilder.append('a');
                            continue;
                        case 11:
                        stringBuilder.append('b');
                            continue;
                        case 12:
                        stringBuilder.append('c');
                            continue;
                        case 13:
                        stringBuilder.append('d');
                        
                            continue;
                        case 14:
                        stringBuilder.append('e');
                        
                            continue;
                        case 15:
                        stringBuilder.append('f');
                    }
            }
        }
    }
    return stringBuilder.reverse().toString();
}
}
// @lc code=end

